[fix] 함수 내부 런타임 에러 블록의 하이라이트가 사라지는 문제 수정 - #3087
Open
prisml wants to merge 1 commit into
Open
Conversation
- 함수 안에서 런타임 에러가 발생하면 경고 토스트는 뜨지만 에러가 발생한 블록에 빨간 테두리가 표시되지 않아 사용자가 원인 블록을 찾을 수 없었습니다 🔍 - 원인: 한 번의 실행에서 서로 다른 블록의 에러가 여러 번 보고될 때, 매번 Entry.Func.edit 을 다시 호출해 cancelEdit → initEditView 로 함수 보드가 재렌더되면서 앞서 적용한 activated 클래스가 지워집니다 🧩 - 마지막 보고가 하이라이트를 복구하지 못하면 경고만 남고 테두리는 사라진 상태로 끝납니다⚠️ - 이미 같은 함수를 편집 중이면 Entry.Func.edit 을 다시 호출하지 않도록 가드를 추가했습니다 🛠️ - Entry.Func.edit 이 실행된 경우에는 Block 인스턴스가 교체될 수 있으므로 블록 참조 대신 id 로 다시 조회하도록 했습니다 ♻️ - block.getCode() 가 없는 경우에 대한 방어 코드를 함께 추가했습니다 🛡️ - 함수 블록이 포함된 작품에서 에러 발생 시 해당 블록에 테두리가 표시되는 것을 확인했습니다 ✅
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
함수 내부 런타임 에러 블록의 하이라이트가 사라지는 문제 수정
🐛 문제 상황
함수(function) 안에서 런타임 에러가 발생하면
빨간색으로 표시된 블록을 확인해 주세요.경고 토스트는 표시되지만, 정작 에러가 발생한 블록에 빨간 테두리가 표시되지 않습니다. 사용자는 안내를 받고도 원인 블록을 찾을 수 없습니다.함수 편집창을 미리 열어둔 상태에서 실행해도 동일하게 재현됩니다.
원인
Entry.Utils.stopProjectWithToast는 함수 내부 에러일 때Entry.Func.edit()으로 함수 편집창을 열고, 그 다음board.activateBlock(block)으로 하이라이트를 적용합니다.그런데 한 번의 실행에서 서로 다른 블록의 런타임 에러가 여러 번 보고될 수 있습니다. 호출부가
stopProjectWithToast를 await하지 않고, 이 함수는 내부에서await engine.toggleStop()을 하므로 첫 await 시점에 즉시 반환됩니다. 엔진이 실제로 멈추기 전까지 다른 tick이 계속 실행되어 추가 에러가 발생합니다.계측 결과 호출 순서는 다음과 같았습니다.
Entry.Func.edit()은 내부에서cancelEdit()→initEditView()를 수행하며 함수 보드를 재렌더합니다. 이 과정에서 앞서 적용된activated클래스가 사라집니다. 마지막 보고가 하이라이트를 복구하지 못하면 경고만 남고 테두리는 없는 상태로 끝납니다.또한
cancelEdit()이content.load()로 함수 코드를 재적재하는 경우 기존Block인스턴스가 교체되어, 미리 캡처해둔 블록 참조가view를 잃을 수 있습니다.✅ 해결 방안
1. 이미 같은 함수를 편집 중이면
Entry.Func.edit()을 다시 호출하지 않음불필요한 보드 재렌더가 사라져 적용된 하이라이트가 유지됩니다. 이미 열려 있는 편집창을 매번 닫고 다시 여는 낭비도 제거됩니다.
2. 블록 참조 대신 id로 재조회
Entry.Func.edit()이 실제로 실행된 경우에는Block인스턴스가 교체될 수 있으므로, id를 남겨두고 편집창을 연 뒤content.findById()로 다시 찾습니다. 찾지 못하면 기존 참조로 폴백합니다.3.
block.getCode()방어 코드 추가함수 정의 블록은
getCode().object가 없을 수 있어 기존 코드가 예외를 던질 여지가 있었습니다.🎯 예상 영향 범위
'funcBlock' in scope.block분기는 손대지 않았습니다.🧪 검증
함수 7개(일반 함수 6, 값 함수 1)를 사용하고 리스트 인덱스 범위를 벗어나는 작품으로 재현·검증했습니다.
📝 남은 과제
동일한 실행에서 에러가 여러 번 보고되면 경고 토스트도 중복 표시됩니다.
stopProjectWithToast가_throttle로 300ms만 묶여 있고, 마지막throw가 async 함수 안에 있어 실행기를 동기적으로 중단하지 못하는 구조적 원인입니다.이번 PR은 리포트된 증상(하이라이트 미표시) 해결에 집중했고, 토스트 중복은 영향 범위가 달라 별도로 다루는 것이 안전하다고 판단했습니다.